﻿#ifndef DEXTEACHSDK_H
#define DEXTEACHSDK_H

#include "DexTeachSDK_global.h"
#include <string>
#include <memory>
#include "dex_def.h"

using namespace std;
namespace Dex {

class DexTeachSDKImpl;
class DEXTEACHSDK_EXPORT DexTeachSDK
{
public:
    DexTeachSDK();
    ~DexTeachSDK();

    void init();

    void uninit();

    /**
     * @brief 1.1 首次连接示教器
     * @param host 主机地址
     * @param port 主机端口号
     */
    void conn(const string &host, uint16_t port);

    /**
     * @brief 1.2 主动断开示教器连接
     */
    void disconn();

    /**
     * @brief 1.3 重连
     */
    void reconn();

    /**
     * @brief 1.4 获取与示教器网络连接状态
     * @return 网络连接状态枚举值
     */
    NetworkStatus getNetworkStatus();


    /**
     * @brief 2.1.1 获取用户坐标系名称
     */
    void getUserCoordinateName();

    /**
     * @brief 2.1.2 设置用户坐标系名称
     * @param userName 用户坐标系名称
     */
    void setUserCoordinateName(const string &userName);

    /**
     * @brief 2.2.1 获取当前速度
     */
    void getCurrentSpeed();

    /**
     * @brief 2.2.2 设置速度
     * @param speedIndex 索引值：0-9
     */
    void setCurrentSpeed(int speedIndex);

    /**
     * @brief 2.3.1 获取伺服状态
     */
    void getServoStatus();

    /**
     * @brief 2.3.2 伺服开启/关闭
     * @param enable 1开启, 0关闭
     */
    void setServoStatus(int enable = 0);

    /**
     * @brief 2.4.1 关节点动
     * @param space 0 关节空间；1 笛卡尔空间
     * @param frame 0 基坐标系；2 用户坐标系
     * @param index 索引
     * @param director 方向
     */
    void jointMovement(int space, int frame, int index, int director);

    /**
     * @brief 2.4.2 关节点动停止
     */
    void jointMovementStop();

    /**
     * @brief 2.4.3 获取关节信息
     */
    void jointInfo();

    /**
     * @brief 2.5.1 移动到目标位置 ---输入目标位置，移动
     * @param space  0 关节空间；1 笛卡尔空间
     * @param frame  0 基坐标系；2 用户坐标系
     * @param x
     * @param y
     * @param z
     * @param a
     * @param b
     * @param c
     */
    void moveTargetPosition(int space, int frame, double x, double y, double z,
                                                double a, double b, double c);

    /**
     * @brief 2.5.2 机器人程序复位（回到初始位置）
     */
    void robotReset();

    /**
     * @brief 2.5.3 门型运动(笛卡尔空间)
     * @param frame 0 基坐标系；2用户坐标系
     * @param x、y、z、a、b、c 目标位置的6个维度值
     * @param height 绝对高度
     */
    void gateMotion(int frame, double x, double y, double z,
                    double a, double b, double c, double height);

    /**
     * @brief 2.6.1 寸动XYZABC轴 ---步进模式, 移动
     * @param index 0:X 1:Y 2:Z 3:A 4:B 5:C
     * @param dir  0 正  1 负
     * @param step 步长
     * @param frame_type 0 基坐标系；2 用户坐标系
     */
    void inchXYZABCShaft(int index, int dir, double step, int frame_type);

    /**
     * @brief 2.7.1 读取I/O信号状态
     */
    void readIOSignalStatus();

    /**
     * @brief 2.7.2 写入I/O状态
     * @param ioStatus 16位输出io状态值
     */
    void writeIOSignalStatus(int ioStatus);

    /**
     * @brief 2.8.1 打开程序
     * @param programName 程序文件名
     */
    void openProgram(const string &programName);

    /**
     * @brief 2.8.2 保存程序
     * @param programName 程序文件名
     */
    void saveProgram(const string &programName);

    /**
     * @brief 2.8.3 加载程序(切换示教/再现模式)
     * @param flag 0 示教模式；1 再现模式
     */
    void loadProgram(int flag = 0);

    /**
     * @brief 2.8.4 机器人程序执行
     */
    void robotRun();

    /**
     * @brief 2.8.5 机器人程序停止
     */
    void robotStop();

    /**
     * @brief 2.8.6 机器人程序运行状态
     */
    void robotStatus();

    /**
     * @brief 2.9.1 获取变量值（获取JOINT,TERMINAL,INT, DOUBLE四种类型变量值）,INT, DOUBLE 仅支持再现模式
     * @param varType 变量类型
     * @param varName 变量名称
     */
    void getVarValue(const string &varType, const string &varName);

    /**
     * @brief 2.9.2 点位示教
     * @param varType 变量类型
     * @param varName 变量名称
     * @param frame 0 基坐标系，2 用户坐标系
     */
    void pointTeach(const string &varType, const string &varName, int frame);

    /**
     * @brief 2.9.3 点位跟踪
     * @param varType 变量类型
     * @param varName 变量名称
     * @param height 门型操作，抬升高度
     * @param frame  0 基坐标系，2 用户坐标系
     */
    void pointTracking(const string &varType, const string &varName, double height, int frame);

    /**
     * @brief 2.9.4 设置变量值-JOINT、TERMINAL
     * @param varType 变量类型
     * @param varName 变量名称
     * @param x 变量x值
     * @param y 变量y值
     * @param z 变量z值
     * @param a 变量a值
     * @param b 变量b值
     * @param c 变量c值
     */
    void setVarValue(const string &varType, const string &varName,
                            double x, double y, double z,
                            double a, double b, double c);
    /**
     * @brief 2.9.4 设置变量值-INT-仅支持再现模式
     * @param varName 变量名称
     * @param value 变量值
     */
    void setVarValue(const string &varName, int value);
    /**
     * @brief 2.9.4 设置变量值-DOUBLE-仅支持再现模式
     * @param varName  变量名称
     * @param value  变量值
     */
    void setVarValue(const string &varName, double value);

    /**
     * @brief 2.10.1 微调
     * @param varName 变量名称
     * @param varType 变量值
     * @param x
     * @param y
     * @param z
     * @param a
     * @param b
     * @param c
     */
    void finetuning(const string& varName, const string& varType,
                    double x, double y, double z,
                    double a, double b, double c);

    /**
     * @brief 2.11.1 清除故障
     */
    void resetWarning();

    /**
     * @brief 2.12.1 获取报警信息（最新一条告警日志）
     */
    void getWarningMessage();

    /**
     * @brief 2.13.1 获取手系（0~90左手系，0~ -90右手系）
     */
    void getHandSystem();

    /**
     * @brief 2.14.1 启动相机套件方案
     * @param ip 相机套件ip
     * @param port 相机套件端口号
     * @param index 0, 1, 2, 3, 4 对应相机套件上5个方案
     * @param speedIndex 0, 1, ..., 9 速度索引值0-9
     */
    void cameraStart(const string &ip, uint16_t port, int index, int speedIndex);

    /**
     * @brief 2.14.2 停止相机套件方案
     * @param ip 相机套件ip
     * @param port 相机套件端口号
     */
    void cameraStop(const string &ip, uint16_t port);

    /**
     * @brief 2.14.3 切换相机套件方案
     * @param ip 相机套件ip
     * @param port 相机套件端口号
     * @param index 0, 1, 2, 3, 4 对应相机套件上5个方案
     */
    void cameraChange(const string &ip, uint16_t port, int index);

    /**
     * @brief 2.14.4 获取相机套件方信息
     * @param ip
     * @param port
     */
    void cameraInfo(const string &ip, uint16_t port);

    /**
     * @brief 2.15.1 获取示教器与控制器连接状态
     */
    void controllerConnect();

    /**
     * @brief 2.16.1 获取当前打开的程序名
     */
    void currentProgramName();

    /**
     * @brief 2.17.1 获取当前操作模式
     */
    void currentOperatorModel();

public:
    ///设置获网络连接状态回调
    void setNetworkStatusCallback(NetworkStatusCallback statusCallback);
    ///设置获获取用户坐标系名称回调
    void setUserCoordinateNameCallback(UserCoordinateNameCallback newUserCoordinateNameCallback);
    ///设置获获取当前速度回调
    void setCurrentSpeedChangedCallback(CurrentSpeedChangedCallback callback);
    ///设置获获取伺服状态回调
    void setServoStatusChangedCallback(ServoStatusChangedCallback callback);
    ///设置获获取关节信息回调
    void setJointInfoChangedCallback(JointInfoChangedCallback callback);
    ///设置获读取I/O信号状态回调
    void setIoSignalStatusChangedCallback(IoSignalStatusChangedCallback callback);
    ///设置获机器人程序运行状态回调
    void setProgramStatusChangedCallback(ProgramStatusChangedCallback callback);
    ///设置获程序行号回调
    void setProgrameLineNumChangedCallback(ProgrameLineNumChangedCallback callback);
    ///设置获取变量值回调
    void setVarValueChangedCallback(VarValueChangedCallback callback);
    void setVarValueForIntChangedCallback(VarValueForIntChangedCallback callback);
    void setVarValueForDoubleChangedCallback(VarValueForDoubleChangedCallback callback);
    ///设置获获取报警信息回调
    void setWarningMessageChangedCallback(WarningMessageChangedCallback callback);
    ///设置获取手系回调
    void setHandSystemChangedCallback(HandSystemChangedCallback callback);
    ///设置获取相机套件信息回调
    void setCameraInfoCallback(CameraInfoCallback callback);
    ///设置示教器与控制器连接状态回调
    void setControllerConnectStatusCallback(ControllerConnectStatusCallback callback);
    ///设置当前打开的程序名回调
    void setCurrentProgramNameCallback(CurrentProgramNameCallback callback);
    ///设置当前操作模式回调
    void setCurrentOperatorModelCallback(CurrentOperatorModelCallback callback);
private:
    shared_ptr<DexTeachSDKImpl> m_dexTeachSDKImpl;
};
}
#endif // DEXTEACHSDK_H
